"""
!/usr/bin/env python
-*- coding: utf-8 -*-
@Author  : MarkJia
@Site    : 
@File    : 5、元组.py
"""

"""
元组定义：
    元组是有序的不可变对象集合
    元组用()包围，各个对象之间用逗号分隔
    元组是异构的，可以包含多种数据类型（列表，字符串，元组，字典，集合等）
"""

# 定义元组
tuple10 = 1, 2, 3
print(type(tuple10), tuple10)  # 结果：<class 'tuple'> (1, 2, 3)

tuple1 = (1, 2, 3)
print(type(tuple1), tuple1)  # 结果：<class 'tuple'> (1, 2, 3)

# 单元素元组，逗号不可或缺
tuple11 = 1,
print(type(tuple11), tuple11)  # 结果：<class 'tuple'> (1,)
tuple15 = (3)
print(type(tuple15), tuple15)  # 结果 ： <class 'int'> (3)

# 通过构造函数   后面是可迭代对象：字符串、列表、元组、字典、集合
tuple2 = tuple([1, 2, 3, 4, 5])
print(type(tuple2), tuple2)  # 结果：<class 'tuple'> (1, 2, 3, 4, 5)

tuple13 = tuple('goodstudy')
print(type(tuple13), tuple13)  # 结果：<class 'tuple'> ('g', 'o', 'o', 'd', 's', 't', 'u', 'd', 'y')

# 元组索引   获取单个元素
tup9 = tuple('hogwarts')
print(tup9[2])  # 结果：g

# 元组切片  获取多个元素 ： [开始值，结束值，步长]  -> 左闭右开：开始值默认是0，步长默认是1
tup10 = tuple('hogwarts')
# 结果是 ： ('h', 'o', 'g')
print(tup10[:3])
print(tup10[0:3:1])

# 元组反转
print(tup10[::-1])  # 结果是 ：('s', 't', 'r', 'a', 'w', 'g', 'o', 'h')

# 元组不可变
# index(目标值),返回元组第一个目标值的索引下标
tuple3 = tuple('goodstudy')
print(tuple3.index('o'))  # 第一个为o的索引是tuple3[1]。结果：1
print(tuple3.index('x'))  # 不存在会报错  ValueError: tuple.index(x): x not in tuple

# count(目标值) 计数
print(tuple3.count('o'))  # 总共有2个0 。结果：2

# 元组解包 ： 把一个可迭代对象里的元素，一并赋值到由对应的变量组成的的元组中（两边的个数是相同的）
a, b, c = (1, 2, 3)
print(a, b, c)  # 因用三个变量接受。结果：1 2 3

# 传统的
tuple14 = (1, 2, 3)
a = tuple14[0]
b = tuple14[1]
c = tuple14[2]
print(a, b, c)  # 结果：1 2 3

"""
元组和列表：
相同点 ： 
    1、都是有序的
    2、都是异构的，能够包含不同类型的对象
    3、都支持索引和切片
不同点 :
    1、声明方式不同。元组用()  列表用 []
    2、列表是可变的的，元组是不可变的
"""
